#include <stdio.h>
#include <math.h>
////一、写一个函数判断一个数是不是素数
////1.1.补充条件，在100-200里面判断是不是素数。
////①那首先输入一个数，紧接着传给判断函数，然后判断函数进行操作，返回一个值。假设返回1，为素数；返回2，为合数。
////②然后将返回值交给main函数if语句进行判断，如果是，打印prime,不是，打印not.
////③素数：只能被1和它本身整除的数称之为素数。例如7.因此，法一：在（2~它本身-1）之间判断能不能整除它本身；
////法二：任何一个数都可以拆分为两个数相乘，而其中必有一个因数小于该数开平方，因此，如果有一个数小于等于它本身开平方能够被该数整除，则说明它不是素数。
////例如：9=3*3；16=4*4；8=2*4；4=2*2...等
//int is_prime(int x){
//    int a = 2;
//    if(x == 1){
//        return 0;
//    }else{
//        for(a = 2;a <=sqrt(x);a++){
//            if(x % a == 0){
//                return 0;
//            }
//        }
//    }
//    return 1;
//}
//int main() {
////    int number = 0;
////    scanf("%d", &number);
////    if (is_prime(number)) {
////        printf("%d is a prime.\n", number);
////    } else {
////        printf("%d is not a prime.\n", number);
////    }
////    return 0;
////}
////判断100-200之间的素数
//    int b = 100,count = 0;
//    for(b = 101;b <= 200;b++){
//        if(is_prime(b)){
//            printf("%d is a prime.\n",b);
//            count++;
//        }
//    }
//    printf("%d\n",count);
//    return 0;
//}
////int main(){
////    printf("%d\n",43);
////    printf("%d\n",printf("%d",43));
////    printf("%d\n",printf("%d     ",printf("%d     ",43)));
////    return 0;
////}
////
////二、写一个函数判断一年是不是闰年
////①那么首先你要输入一个年份，紧接着交给函数进行操作，函数返回来一个值。设返回1为闰年，返回0为不是闰年。
////②主函数里面，if()——真则打印是闰年，假则打印不是闰年。
////③闰年：1.能被4整除且不能被一百整除的称为闰年；2.能被400整除的称为闰年。
////2.1.计算1000-2100年的闰年
//int is_leap(int y){
//    if((y % 4 == 0) && (y % 100 != 0)){
//        return 1;
//    }else if(y % 400 ==0){
//        return 1;
//    }else{
//        return 0;
//    }
//}
//int main(){
//    int year = 0;
//    scanf("%d",&year);
////    int year = 1000,count = 0;
////    for(year = 1000;year <= 2100;year++){
////        if(is_leap(year)){
////            printf("%d is a leap year.\n",year);
////            count++;
////        }//else{
//////            printf("%d is not a leap year.\n",year);
//////        }
////    }
//    if(is_leap(year)){
//        printf("%d is a leap year.\n",year);
//    }else{
//        printf("%d is not a leap year.\n",year);
//    }
//    return 0;
//}
//
//三、写一个函数，实现一个整形有序数组的二分查找。
//①那么首先必须要有一个整形的有序数组，其次将这个数组传给函数，还要传要找的数k；
//②设找到了，（返回1，并算出此时的下标是：__）直接返回下标mid;找不到，返回-1，表示找不到。
//为什么不返回0呢？因为下标为0有可能表示的是数组的第一个元素！！！
//③将返回值进行main函数if()语句操作。if()————真，打印下标值；假，打印找不到该值。
//二分查找：利用左右下标进行比较对比。一开始取中间值，如果k比中间值小，则表示k在中间值的左边，此时右坐标为mid-1，左坐标不变；
//同理，如果k比中间值大，则说明k在中间值的右边，此时左下标为mid+1，右坐标不变。
//以此类推，遍历排序，一直到左坐标等于右坐标。
//特别提示，还需要传给函数数组的个数，因为传参数给函数，函数本质上只接收了第一个元素的首地址，并不是完整的数组，所以要传元素个数给函数，告诉函数数组有多少个元素。
int binary_search(int arr[],int x,int y){
    int left = 0,a = 0;
    int right = y -1;
    int mid = left + (right - left)/2;
    while(left <= right){
        if(x < arr[mid]){
            right = mid - 1;
            mid = left + (right - left)/2;
        }else if(x > arr[mid]){
            left = mid + 1;
            mid = left + (right - left)/2;
        }else{
//            printf("The subscript is %d.\n",mid);
            return mid;
        }
    }
    if(left > right){
        return -1;
    }
}
int main(){
    int arr[] = {1,2,3,4,5,6,7,8,9};
    int k = 100;
    int sz = sizeof(arr) / sizeof(arr[0]);
    int ret = binary_search(arr,k,sz);
    if(ret != -1){
        printf("The subscript is %d\n",ret);
    }else{
        printf("There is not this number.\n");
    }
    return 0;
}